package java2022_07_13;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

//扫描指定目录，并找到名称或者内容中包含指定字符的所有普通文件(不包含目录）
public class FileDemo16 {
    public static void main(String[] args) throws IOException {
        //1.让用户输入一个路径，带搜索的路径
        System.out.print("请输入要扫描的根目录:");
        Scanner scanner = new Scanner(System.in);
        String rootDir = scanner.next();
        File rootFile = new File(rootDir);
        if(!rootFile.isDirectory()){
            System.out.println("该目录不存在或者不是文件，直接退出！");
            return;
        }
        //2.再让用户输入一个查询词，表示要搜索的结果中要包含这个词
        System.out.print("请输入要查找的关键词:");
        String query = scanner.next();
        //3.遍历目录以及文件，进行匹配
        List<File> results = new ArrayList<>();
        scanDirWithContent(rootFile,query,results);
        //4.把结果打印出来
        for(File f : results){
            System.out.println(f.getCanonicalFile());
        }
    }

    private static void scanDirWithContent(File rootFile, String query, List<File> results) {
        File[] files = rootFile.listFiles();
        if(files == null || files.length == 0){
            return;
        }
        for(File f : files){
            if(f.isDirectory()){
                scanDirWithContent(f,query,results);
            }else{
                //查看文件名称中是否包含
                if(f.getName().contains(query)){
                    results.add(f);
                //查看文件内容中是否包含
                }else if(isContentContains(f,query)){
                    results.add(f);
                }
            }
        }
    }

    private static boolean isContentContains(File f, String query) {
        //打开f 这个文件，依次取出每一行结果，去和query 进行一个indexOf比较
        StringBuilder stringBuilder = new StringBuilder();
        try(InputStream inputStream = new FileInputStream(f)){
            Scanner scanner = new Scanner(inputStream,"UTF-8");
            while (scanner.hasNextLine()){
                String line = scanner.nextLine();
                stringBuilder.append(line+"\n");
            }
        }catch (IOException e){
            e.printStackTrace();
        }
       //只要结果不等于 -1 ;就说明查到了
        return stringBuilder.indexOf(query) != -1;
    }
}
